package com.ujs.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

import org.springframework.context.annotation.Configuration;

/**
 * @title: SecurityConfiguration
 * @Author liyunxiao
 * @Date: 2021/1/12 1:29
 */
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    //执行权限配置，如：为指定资源分配权限，开放无需权限的资源等
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //父类中默认进行了配置，我们将其拿到子类，按照自己的需求进行修改
        http
                .authorizeRequests()//进行权限设置
                .anyRequest()//任何请求
                .authenticated()//进行认证
                // 这是ant语法，表示向后退一步，回到HttpSecurity位置的那一个级别,
                // 可以认为是使用这种方式实现HttpSecurity对象通过连续调用方法实现配置，
                // 每进行一个板块的配置完毕，则向后退一步回到HttpSecurity位置
                .and()
                .formLogin()//设置表单登录，后续可以在这里修改自定义登录页面
                .loginPage("/login") //设置自定义的登录页面

                //指定处理登录请求的路径，对应form表单的action地址
                .loginProcessingUrl("/login").permitAll()
                //设置接收表单提交的用户name，默认为username
                .usernameParameter("username")
                //设置接收表单提交的用户密码，默认为password
                .passwordParameter("password")
                //指定权限认证失败跳转的错误页面
                .failureUrl("/failer")
                //直接访问登录页面时返回的地址,如果访问的是登录页的话返回指定的地址
                .defaultSuccessUrl("/main",true)
                //指定退出登录URL
                .and().logout().logoutUrl("/logout")
                           .logoutSuccessUrl("/login") //设置退出后跳转的路径
                .and().csrf().disable() //禁用csrf功能，这里暂时用不到
        ;
    }

    //设置不需要权限认证的资源
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/css/**","/img/**","/js/**",
                "/plugins/**","/img/**");
    }
}

